package model.persistence.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.persistence.AbstractDAO;

import model.business.Professor;
import model.business.ProfessorImpl;


public class PostgresProfessorDAO extends AbstractDAO{

    public Object insert(Object dto) throws SQLException {
        if(!(dto instanceof Professor)) //se algo que nao seja Professor
            throw new SQLException("Tipo de dado inválido para cadastro no banco de dados");

        Professor Professor = (Professor) dto;

        Connection connection = this.getConnection();
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try{
            statement = connection.prepareStatement("INSERT INTO Professor (NOME, ESPECIALIZACAO, SITUACAO, TELEFONE1, TELEFONE2, SEXO, CIDADE_ID) VALUES (?,?,?,?,?,?,?);"); //prepareStatement - executa comandos SQL, ? separadas por virgula
            statement.setString(1, Professor.getNome());
            statement.setString(2, Professor.getEspecializacao());
            statement.setString(3, Professor.getSituacao());
            statement.setString(4, Professor.getTelefone1());
            statement.setString(5, Professor.getTelefone2());
            statement.setString(6, Professor.getSexo());
            statement.setString(7, Professor.getCidade_id());
 
            statement.execute();

            statement = connection.prepareStatement("SELECT * FROM Professor WHERE NOME = ? AND ESPECIALIZACAO = ? AND SITUACAO = ? AND TELEFONE1 = ? AND TELEFONE2 = ? AND SEXO = ? AND CIDADE_ID = ?");
            statement.setString(1, Professor.getNome());
            statement.setString(2, Professor.getEspecializacao());
            statement.setString(3, Professor.getSituacao());
            statement.setString(4, Professor.getTelefone1());
            statement.setString(5, Professor.getTelefone2());
            statement.setString(6, Professor.getSexo());
            statement.setString(7, Professor.getCidade_id());

             
            resultSet = statement.executeQuery();//traz o q esta no cache do banco pra voce
            resultSet.next();

            Professor = new ProfessorImpl(resultSet.getInt("ID"), resultSet.getString("NOME"), resultSet.getString("ESPECIALIZACAO"), resultSet.getString("SITUACAO"), resultSet.getString("TELEFONE1"), resultSet.getString("TELEFONE2"), resultSet.getString("SEXO"), resultSet.getString("CIDADE_ID"));

        }catch(SQLException erroBD){
            throw new SQLException("Não foi possível cadastrar o Professor. \n Motivo:  \n" + erroBD.getMessage());
        }finally{
            if(statement != null)
                statement.close();
        }
        return Professor;
    }

    public Object update(Object dto) throws SQLException {
         if(!(dto instanceof Professor)) //se algo que nao seja Professor
            throw new SQLException("Tipo de dado inválido para cadastro no banco de dados");

        Professor Professor = (Professor) dto;

        Connection connection = this.getConnection();
        PreparedStatement statement = null;

        try{
            statement = connection.prepareStatement("UPDATE Professor SET NOME = ?,SET ESPECIALIZACAO = ?,SET SITUACAO = ?,SET TELEFONE1 = ?,SET TELEFONE2 = ?,SET SEXO = ?, SET CIDADE_ID = ?, WHERE ID = ?;");
            statement.setString(1, Professor.getNome());
            statement.setString(2, Professor.getEspecializacao());
            statement.setString(3, Professor.getSituacao());
            statement.setString(4, Professor.getTelefone1());
            statement.setString(5, Professor.getTelefone2());
            statement.setString(6, Professor.getSexo());
            statement.setString(7, Professor.getCidade_id());

            int oid = ((Integer) Professor.getOID()).intValue();
            statement.setInt(8, oid);
            statement.execute();

        }catch(SQLException erroBD){
            throw new SQLException("Não foi possível alterar o Professor. \n Motivo: " + erroBD.getMessage());
        }finally{
            if(statement != null)
                statement.close();
        }
        return Professor;
    }

    public void delete(Object dto) throws SQLException {
        if(!(dto instanceof Professor)) //se algo que nao seja Professor
            throw new SQLException("Tipo de dado inválido para cadastro no banco de dados");

        Professor Professor = (Professor) dto;

        Connection connection = this.getConnection();
        PreparedStatement statement = null;

        try{
            statement = connection.prepareStatement("DELETE FROM Professor WHERE ID = ?;");
            
            int oid = ((Integer) Professor.getOID()).intValue();
            statement.setInt(1, oid);
            statement.execute();

        }catch(SQLException erroBD){
            throw new SQLException("Não foi possível excluir o Professor. \n Motivo: " + erroBD.getMessage());
        }finally{
            if(statement != null)
                statement.close();
        }
    }

      public Object find(Object oid) throws SQLException {
        if(!(oid instanceof Integer))
            throw new SQLException("ID não é um número inteiro.");
        int idlogin = ((Integer) oid).intValue();
        Connection connection = this.getConnection();
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        Professor Professor = null; //posso criar tambem ProfessorImpl Professor
        try{
            statement = connection.prepareStatement("SELECT * FROM Professor WHERE ID = ?;");
            statement.setInt(1, idlogin);
            resultSet = statement.executeQuery();
            if(!resultSet.next())
                throw new SQLException("Não existe Professor com idlogin = " + idlogin);
            Professor = new ProfessorImpl(resultSet.getInt("ID"),resultSet.getString("NOME"),resultSet.getString("ESPECIALIZACAO"), resultSet.getString("TELEFONE1"), resultSet.getString("TELEFONE2"), resultSet.getString("SEXI"), resultSet.getString("CIDADE"), resultSet.getString("CIDADE_ID"));

        }catch(SQLException erroBD){
            throw new SQLException("Não foi possível encontrar o Professor \n Motivo: " + erroBD.getMessage());
        }finally{
            if(resultSet != null)
                resultSet.close();
            if(statement != null)
                statement.close();
        }
        return Professor;
    }      
       
}
